package com.second.hand.trading.server.utils;

import com.second.hand.trading.server.service.OrderService;

import java.util.concurrent.DelayQueue;

/**
 * OrderTaskHandler 用于管理订单的延迟处理任务队列，实现订单超时自动处理。
 * 主要功能包括：
 * 1. 维护一个 DelayQueue<OrderTask>，用于存放所有需要延迟处理的订单任务。
 * 2. 启动后台线程不断轮询队列，处理到期的订单任务（如自动取消未支付订单）。
 * 3. 提供添加订单延迟任务的方法。
 */
public class OrderTaskHandler {

    /**
     * 订单服务对象，用于执行订单状态的更新操作。
     * 需要在外部初始化赋值（如通过Spring注入）。
     */
    public static OrderService orderService = null;

    /**
     * 延迟队列，存放所有待处理的订单延迟任务。
     * DelayQueue 会根据任务的到期时间自动排序，到期后才能被取出处理。
     */
    private static DelayQueue<OrderTask> delayQueue = new DelayQueue<>();

    /**
     * 启动延迟任务处理线程。
     * 该线程会不断轮询 delayQueue，取出到期的订单任务并调用 orderService 进行处理。
     * 处理逻辑：如果订单状态更新成功，输出“成功取消订单”；否则输出“取消任务”。
     */
    public static void run() {
        new Thread(() -> {
            System.out.println("Success !");
            while (true) {
                // 只有当 orderService 已初始化且队列不为空时才处理任务
                if (orderService != null && delayQueue.size() > 0) {
                    // 从队列中取出到期的订单任务（未到期则返回null）
                    OrderTask orderTask = delayQueue.poll();
                    if (orderTask != null) {
                        // 调用订单服务更新订单状态
                        if (orderService.updateOrder(orderTask.getOrderModel())) {
                            System.out.println("成功取消订单：" + orderTask.getOrderModel());
                        } else {
                            System.out.println("取消任务：" + orderTask.getOrderModel());
                        }
                    }
                }
            }
        }).start();
    }

    /**
     * 向延迟队列中添加一个订单延迟任务。
     * @param o 需要延迟处理的订单任务
     */
    public static void addOrder(OrderTask o) {
        System.out.println("添加任务：" + o);
        delayQueue.put(o);
    }
}
